;==================================================
;NES端口常量
PPU_CTRL                =   $2000   ;PPU 控制寄存器, 控制一般 PPU 操作的各种标志
;7  bit  0
;---- ----
;VPHB SINN
;|||| ||||
;|||| ||++- 基础命名表地址
;|||| ||    (0 = $2000; 1 = $2400; 2 = $2800; 3 = $2C00)
;|||| |+--- 每次 CPU 读取/写入 PPUDATA 后 VRAM 地址增量
;|||| |     (0: 横向, 地址加1；1: 纵向, 地址加32。)
;|||| +---- 8x8 精灵的精灵图案表地址
;||||       (0: $0000; 1: $1000; 在 8x16 模式下忽略)
;|||+------ 背景图案表地址 (0: $0000; 1: $1000)
;||+------- 精灵大小 (0: 8x8 像素; 1: 8x16 像素 – see PPU OAM#Byte 1)
;|+-------- PPU 主/从选择, NES 上未使用
;|          (0: 从 EXT 引脚读取背景; 1: 输出颜色在EXT引脚上。)
;+--------- 在垂直消隐间隙开始时生成一个NMI。(0: 禁用; 1: 启用)

PPU_MASK                =   $2001   ;PPU 掩码寄存器, 此寄存器控制精灵和背景的渲染，以及颜色效果
;7  bit  0
;---- ----
;BGRs bMmG
;|||| ||||
;|||| |||+- 灰度 (0: 正常颜色，1: 生成灰度显示)
;|||| ||+-- 1: 显示屏幕最左边8个像素的背景，0: 隐藏
;|||| |+--- 1: 显示屏幕最左边的8个像素精灵，0: 隐藏
;|||| +---- 1: 显示背景
;|||+------ 1: 显示精灵
;||+------- 强调红色(PAL/Dendy上是绿色)
;|+-------- 强调绿色(PAL/Dendy上为红色)
;+--------- 强调蓝色

PPU_STATUS              =   $2002   ;PPU状态寄存器: 读取后PPU_SCROLL和PPU_ADDRESS被复位，
                                    ;下一个写到PPU_SCROLL的数据是水平的，写到PPU_ADDRESS的数据是高位
;7  bit  0
;---- ----
;VSO. ....
;|||| ||||
;|||+-++++- PPU开放总线。返回旧的PPU总线内容
;||+------- 精灵溢出。
;||         本意是在扫描线上出现超过八个精灵时设置此标志，
;||         但硬件错误导致实际行为更加复杂，会产生误报和漏报；
;||         请参阅PPU精灵评估。
;||         此标志在精灵评估期间设置，
;||         并在预渲染行的第一个点(第二个点)清除。
;|+-------- 0号精灵碰撞。
;|          当精灵0的非零像素与非零背景像素重叠时设置；
;|          在预渲染行的第1个点清除。用于栅格计时。
;+--------- 垂直消隐 已开始(0：不在 vblank 中;1：在 vblank 中).
;           设置在第 241 行的第 1 点(渲染后行之后的行);
;           在读取 2002 美元和预渲染线的第 1 点后清除.
                                    
PPU_OAM_ADDR            =   $2003   ;精灵RAM地址: 用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。
                                    ;每次访问PPU_OAM_DATA后该地址增加1
                                    
PPU_OAM_DATA            =   $2004   ;精灵RAM数据: 用来读/写精灵内存。
                                    ;地址通过PPU_OAM_ADDR来设置，每次访问后地址增加1
                                    
PPU_SCROLL              =   $2005   ;屏幕滚动偏移: 第一个写的值会进入垂直滚动寄存器(若>239，被忽略)。
                                    ;第二个值出现在水平滚动寄存器
                                    
PPU_ADDRESS             =   $2006   ;VRAM地址: 设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。
                                    ;第二个写低8位。每次访问PPU_DATA后地址增加
                                    
PPU_DATA                =   $2007   ;VRAM数据: 用来访问VRAM数据，
                                    ;通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32
                                    
OAM_DMA                 =   $4014   ;DMA访问精灵RAM: 通过写一个值xx到这个端口，
                                    ;引起CPU内存地址为$xx00－$xxFF的区域传送到精灵内存
                                    
APU_STATUS              =   $4015   ;声音通道切换

JOY1                    =   $4016   ;手柄1
;7  bit  0
;---- ----
;xxxx xEES
;      |||
;      ||+- 控制器端口锁存位
;      ++-- 扩展端口锁存位

JOY2_FRAME              =   $4017   ;手柄2 + 选通
;7  bit  0
;---- ----
;xxxD DDDD
;|||+-++++- 输入数据线 D4 - D0
;+++------- 开放总线
;==================================================
